#ifndef MERGER_H_
#define MERGER_H_

#include "MergeBuffer.h"
#include "AlmacenamientoIndice.h"
#include "AlmacenamientoDocFrec.h"
#include "Lexico.h"
#include "global.h"
#include "RegistroDocPeso.h"
#include "RegistroDistancias.h"
#include "AlmacenamientoDocs.h"

#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <math.h>

#define VIAS 2

using namespace std;

class Merger
{
	private:
		int nroArchivosTemporales;
		int nroDocumentos;
		int mergeBufferSize;
		AlmacenamientoIndice * outIndex;
		AlmacenamientoIndice * inIndex1;
		AlmacenamientoIndice * inIndex2;
		AlmacenamientoDocFrec * outDocFrec;
		AlmacenamientoDocFrec * inDocFrec1;
		AlmacenamientoDocFrec * inDocFrec2;
		Lexico * outLexico;
		Lexico * inLexico1;
		Lexico * inLexico2;

		AlmacenamientoDocs * inIndexDocs;
		float * vectorNormas;

		vector<RegistroIndiceMemoria * > destruccion;

		bool ultimo;

		int FillBuffer(
			AlmacenamientoIndice* inIndex,
			Lexico* lexico,
			AlmacenamientoDocFrec* inDocFrec,
			MergeBuffer & buffer,
			bool & moreData,
			RegistroIndiceMemoria* &regIndex,
			int & nroRegistro );

		void Merge();
		void Copy(RegistroIndiceMemoria * regIndex, MergeBuffer & buffer, int & Index);
		void instanciarObjetosAlmacenamiento();
		void setearDestruiblesAlmacenamiento();
		void borrarObjetosAlmacenamiento();
		tListaDocDistancias * mergeListaDocFrec(tListaDocDistancias * lista1, tListaDocDistancias * lista2);

		RegistroIndiceMemoria* obtenerRegistroIndiceMemoria(
			int offset,
			AlmacenamientoIndice* inIndex,
			Lexico * lexico,
			AlmacenamientoDocFrec * inDocFrec );

		void guardar(RegistroIndiceMemoria * regMem);

		list<RegistroDistancias *> * transformarFrecuenciaEnPeso(list<RegistroDistancias *> * lista);
		float calcularPeso(int frecuenciaTerminoDoc, int frecuenciaTermino);

		void guardarNormaDocumentos();

		void archivoTemporalUnico();

	public:
		Merger(int nroArchivosTemporales, int nroDocumentos, int mergeBufferSize);
		virtual ~Merger();
		void merge();
};

#endif /*MERGER_H_*/
